"""author: wenyao
   data: 2020/10/27
   project: ludingji
"""

#unicode 万国码  基本上所有的文字都给了一个编号
#ascii码    对英文字符进行一个编号

#编码 就是人类语言和机器语言的一种映射关系
#unicode 编码的具体实现方式 utf-8, utf-18, utf-32
#utf-8 可变长编码方式
#一个英文字符占用一个字节
#一个中文字符占用三个字节

#中国  gbk  gb2132
#gbk 一个字符占用2个字节   中文较多的时候，可以使用gbk编码方式，节省存储空间

# bytes
# 转换：bytes->str ： decode('utf8')
# str
# 转换： str->bytes： encode('utf8')

#查看编码
# >>> ord("a")
# 97
# >>> ord("A")
# 65
# >>> ord("中")
# 20013
# >>> ord("文")
# 25991
# >>> ord("“")
# 8220
# >>> bin()
# KeyboardInterrupt
# >>> bin(20013)
# '0b100111000101101'
# "01001110 00101101"

# >>> str1 = "中文"
# >>> str1.encode("utf-8")
# b'\xe4\xb8\xad\xe6\x96\x87'
# >>> bin(0xe4)
# '0b11100100'
# >>> bin(0xb8)
# '0b10111000'

##############以什么方式加码，就要以什么方式解码##############
#文件打开乱码，一般情况下为加码和解码的方式不一致
# >>> str1.encode("gbk").decode("gbk")
# '中文'
# >>> str1.encode("gbk").decode("utf-8")
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd6 in position 0: invalid continuation byte

#########################文件操作##############################################################
#文件打开 --> open
#指定不同编码方式打开文件
#默认为编码打开方式为None，跟平台语言编码环境有关， 平台是utf-8，这里就是utf-8
# 使用指定参数encoding 可以修改编码方式
#open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
# file : 要打开的文件名( str )
# mode: 打开文件的方式( str ) => text, bytes
# encoding: 文件编码方式（str）
# errors: 当发生编码错误时的处理方式（str）
#                 'ignore'或'strict'(默认)
# buffering: 缓存方式 ( int）

###########encoding参数####################
# >>> fp = open("utf.txt")
# >>> fp.read()
# '中文\naaa\nbbb\nccc\n'
# >>> fp = open("win-utf.txt")
# >>> fp.read()
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
#   File "/usr/lib64/python3.6/codecs.py", line 321, in decode
#     (result, consumed) = self._buffer_decode(data, self.errors, final)
# UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd6 in position 7: invalid continuation byte
# >>> fp = open("win-gbk.txt",encode = "gbk")
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# TypeError: 'encode' is an invalid keyword argument for this function
# >>> fp = open("win-gbk.txt",encoding = "gbk")
# >>> fp.read()
# 'window 中文'

#=========windows utf-8 与linux utf-8文本
#===linux
# >>> fp = open("utf.txt")
# >>> fp.read()
# '中文\naaa\nbbb\nccc\n'
#===window
# >>> fp = open("win-utf.txt")
# >>> fp.read()
# '\ufeffwindow 中文'
# >>> fp = open("win-utf.txt".encoding = "utf-8-sig")
#   File "<stdin>", line 1
# SyntaxError: keyword can't be an expression
# >>> fp = open("win-utf.txt",encoding = "utf-8-sig")
# >>> fp.read()
# 'window 中文'

########检测文件编码######
#以二进制方式打开
# >>> import chardet
# >>> fp = open("win-utf.txt")
# >>> chardet.detect(fp.read())
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
#   File "/usr/local/lib/python3.6/site-packages/chardet/__init__.py", line 34, in detect
#     '{0}'.format(type(byte_str)))
# TypeError: Expected object of type bytes or bytearray, got: <class 'str'>
# >>> fp = open("win-utf.txt","rb")
# >>> chardet.detect(fp.read())
# {'encoding': 'UTF-8-SIG', 'confidence': 1.0, 'language': ''}
# >>> fp2 = open("utf.txt","rb")
# >>> chardet.detect(fp2.read())
# {'encoding': 'utf-8', 'confidence': 0.7525, 'language': ''}

######打开文件方式  mode################

#读模式（默认模式）
#只读，不能编写，文件不存在报错
#不可以write ，可以read
# >>> fp = open("utf.txt")
# >>> fp.write("aa")
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# io.UnsupportedOperation: not writable
# >>> fp = open("utf.txt",mode="r")
# >>> fp = open("utf.txt","r")
# >>> fp.write("aa")
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# io.UnsupportedOperation: not writable
# >>> fp.read()
# '中文 xxx yyy\naaa\nbbb\nccc\n'
# >>> fp = open("utf2.txt","r")
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# FileNotFoundError: [Errno 2] No such file or directory: 'utf2.txt'


#写模式
#写缓冲， 默认情况只有在缓冲区满，或者文件对象关闭（fp.close()），或者程序退出的时候，才会写到磁盘

#写模式--w  以覆盖方式写入，文件不存在就新建，跟shell中的> 重定向类似
# >>> fp = open("utf.txt","w")
# >>> fp.read()
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# io.UnsupportedOperation: not readable
# >>> fp.write("this is test")
# 12
# >>> fp.close()
#写模式--x   新建文件，并且写入。  如果文件存在就报错
# >>> fp = open("utf2.txt","x")
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# FileExistsError: [Errno 17] File exists: 'utf2.txt'

######文件模式
#  t  --》 text  默认文本模式
#  b  -->   二进制模式

#########读写模式
#   r+ 、 w+ 、 a+ 、 x+

#########文件读取####
#f.tell() 文件光标->(字节位置) 整数 int
#f.seek(cookie, whence=0)   移动光标位置 cookie=> 偏移量 whence=> 相对位置 (0-> 开始, 1->当前, 2->末尾)
#注意：1、2只能用b模式打开才 可以

# >>> fp = open("aa.txt","r")
# >>> fp.read(10)
# '你好\n世界\nwelc'
# >>> fp.tell()
# 18
# >>> fp.seek(10)
# 10
# >>> fp.read(10)
# '界\nwelcome '
# >>> fp.read()
# 'to sanchuang\n'
# >>> fp.seek(9)
# 9
# >>> fp.read(10)
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
#   File "/usr/lib64/python3.6/codecs.py", line 321, in decode
#     (result, consumed) = self._buffer_decode(data, self.errors, final)
# UnicodeDecodeError: 'utf-8' codec can't decode byte 0x96 in position 0: invalid start byte

#二进制模式打开文本
# >>> fp = open("aa.txt","rb")
# >>> fp.tell()
# 0
# >>> fp.read(10)
# b'\xe4\xbd\xa0\xe5\xa5\xbd\n\xe4\xb8\x96'
# >>> fp.read(10).decode("utf-8")
# '界\nwelcom'
# >>> fp.seek(3,1)
# 23
# >>> fp.read(3)
# b'o s'
# >>> fp.seek(-5,2)
# 30
# >>> fp.read()
# b'uang\n'
# >>> fp.read()
# b''
# >>> fp.seek(0)
# 0
# >>> fp.read()
# b'\xe4\xbd\xa0\xe5\xa5\xbd\n\xe4\xb8\x96\xe7\x95\x8c\nwelcome to sanchuang\n'

#f.read() 返回当前到文末(字符串)，可指定 字符数
#fp.readlines() 返回当前到文末的一个列表
#fp.readline   返回当前到文末的一个列表
# >>> fp = open("aa.txt","r")
# >>> fp.read()
# '你好\n世界\nwelcome to sanchuang\n'
# >>> fp.readlines()
# []
# >>> fp.seek(0)
# 0
# >>> fp.readlines()
# ['你好\n', '世界\n', 'welcome to sanchuang\n']
# >>> fp.readline()
# ''
# >>> fp.seek(0)
# 0
# >>> fp.readline()
# '你好\n'
# >>> fp.readline()
# '世界\n'
# >>> fp.readline()
# 'welcome to sanchuang\n'
# >>> fp.readline()

#########写磁盘#########
#写缓存
# 什么时候会写入磁盘
# • f.flush()
# • f.close()
# • buffer设置（默认：io.DEFAULT_BUFFER_SIZE )
#     • 0 => 实时写入 （binary mode）
#     • 1 => 行缓存 （ text mode） => \n
#     • 其他数字n => 缓冲区大小n=2的时候 缓冲区大小 : 2*4096

# >>> fp_buff = open("aa.txt","a+",buffering=2)
# >>> fp_buff.write("\n buffering test")
# 16
# >>> fp_buff.write("a"*4096)
# 4096
# >>> fp_buff.write("a"*4096)
# 4096
